package com.demo01_video.service;

import com.demo01_video.bean.Video;
import com.demo01_video.repository.VideoRepository;
import com.demo01_video.uitl.MinioUtil;
import com.user_service.util.SnowflakeIdGenerator;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

// 业务逻辑层
@Service
@RequiredArgsConstructor
@Slf4j
public class VideoService {
    private final VideoRepository videoRepository;
    private final KafkaTemplate<String, String> kafkaTemplate;
    private final MinioUtil minioUtil;

    public void publishVideo(MultipartFile  file, String title, Long authorId)throws IOException{
        try{
            // 检查文件是否为空
            if (file.isEmpty()) {
                throw new IOException("上传文件为空");
            }
            
            //1.上传视频到MinIO，获取视频的URL和封面的URL
            log.info("开始上传视频到MinIO，文件名: {}", file.getOriginalFilename());
            String videoUrl = minioUtil.upload(file);
            log.info("视频上传成功，URL: {}", videoUrl);
            
            //2.生成封面图URL(简易做法：用一个默认图，或调用FFmpeg生成-此处可简化)
            String coverUrl = "https://video/default-cover.jpg";//默认封面图
            //3.保存视频信息到数据库,状态设置为0
            Video video = new Video();
            video.setTitle(title);
            video.setVideoUrl(videoUrl);
            video.setCoverUrl(coverUrl);
            video.setAuthorId(authorId);
            video.setStatus(0);
            Video savedVideo=videoRepository.save(video);
            log.info("视频信息保存成功，视频ID: {}", savedVideo.getId());
            
            //4.将视频发布到Kafka中,通知"转码服务"进行处理
            kafkaTemplate.send("video-publish", savedVideo.getId().toString());
            log.info("已发送视频发布消息到Kafka，视频ID: {}", savedVideo.getId());
            //5.返回结果给前端
        }catch (Exception e){
            log.error("视频上传过程中出现错误: {}", e.getMessage(), e);
            throw new IOException( "视频上传失败",e);
        }
    }
    
    /**
     * 根据标题搜索视频（演示非分片键查询）
     * 在实际分库分表环境中，这需要在所有分片中搜索然后合并结果
     * @param title 视频标题
     * @return 视频列表
     */
    public Iterable<Video> searchVideosByTitle(String title) {
        // 在实际分库分表实现中，这里需要实现跨分片查询逻辑
        // 可以使用分页查询减少资源消耗
        return videoRepository.findAll(); // 简化实现，实际应根据title查询
    }
}